#include <string>
#include <memory>

using namespace std;

class HasPtr {
    public:
        HasPtr(string s): ps(new string(s)), i(1) {}
        // 移动构造函数
        HasPtr(HasPtr&& p) noexcept : ps(p.ps), i(p.i) { p.ps = 0; };
        // 赋值运算符既是移动赋值运算符，也是拷贝赋值运算符
        HasPtr& operator=(HasPtr rhs) 
                        { swap(*this, rhs); return *this; };
    private:
        string *ps;
        int i;
};

int main()
{
    HasPtr hp2("aaa");
    // HasPtr hp = hp2; // hp2 是一个左值；hp2 通过拷贝构造函数来拷贝
    HasPtr hp = std::move(hp2); // 移动构造函数移动 hp2
}